{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "import io\n",
    "import os\n",
    "import platform\n",
    "import pdb\n",
    "\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from matplotlib.pyplot import cm\n",
    "\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.optim as optim\n",
    "from sklearn import preprocessing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "data=pd.read_csv(\"./vancouver.csv\")\n",
    "data=data.iloc[:,2:]\n",
    "data.replace(9999,np.nan,inplace=True)\n",
    "data.replace(-999,np.nan,inplace=True)\n",
    "for i in range(len(data)):\n",
    "    for j in range(len(data.columns)):\n",
    "        if np.isnan(data.iat[i,j]):\n",
    "            if i==0:\n",
    "                data.iloc[i,j]=data.iat[i+1,j]\n",
    "            elif i==len(data)-1:\n",
    "                data.iloc[i,j]=data.iat[i-1,j]\n",
    "            else:\n",
    "                data.iloc[i,j]=np.nanmean([data.iat[i-1,j],data.iat[i+1,j]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "# data.fillna(np.mean(data),inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>TEMP_MEAN</th>\n",
       "      <th>SO2</th>\n",
       "      <th>O3</th>\n",
       "      <th>CO</th>\n",
       "      <th>HUMIDITY</th>\n",
       "      <th>NO2</th>\n",
       "      <th>NO</th>\n",
       "      <th>WDIR_SCLR</th>\n",
       "      <th>RAD_TOTAL</th>\n",
       "      <th>WSPD_VECT</th>\n",
       "      <th>WSPD_SCLR</th>\n",
       "      <th>ATM_PRESS_1HR</th>\n",
       "      <th>WDIR_VECT</th>\n",
       "      <th>PM25</th>\n",
       "      <th>PRECIP_TOTAL</th>\n",
       "      <th>PM10</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>17524</th>\n",
       "      <td>10.9</td>\n",
       "      <td>0.5</td>\n",
       "      <td>24.0</td>\n",
       "      <td>0.15</td>\n",
       "      <td>80.6</td>\n",
       "      <td>7.2</td>\n",
       "      <td>0.4</td>\n",
       "      <td>83.6</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4.50</td>\n",
       "      <td>4.59</td>\n",
       "      <td>101.1</td>\n",
       "      <td>82.2</td>\n",
       "      <td>3.6</td>\n",
       "      <td>0.0</td>\n",
       "      <td>20.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17525</th>\n",
       "      <td>10.8</td>\n",
       "      <td>0.4</td>\n",
       "      <td>23.8</td>\n",
       "      <td>0.13</td>\n",
       "      <td>82.0</td>\n",
       "      <td>7.3</td>\n",
       "      <td>0.5</td>\n",
       "      <td>90.4</td>\n",
       "      <td>11.6</td>\n",
       "      <td>6.83</td>\n",
       "      <td>7.17</td>\n",
       "      <td>101.1</td>\n",
       "      <td>91.1</td>\n",
       "      <td>3.2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>20.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17526</th>\n",
       "      <td>10.8</td>\n",
       "      <td>0.5</td>\n",
       "      <td>21.6</td>\n",
       "      <td>0.15</td>\n",
       "      <td>83.5</td>\n",
       "      <td>9.7</td>\n",
       "      <td>1.2</td>\n",
       "      <td>87.0</td>\n",
       "      <td>55.3</td>\n",
       "      <td>6.61</td>\n",
       "      <td>6.90</td>\n",
       "      <td>101.1</td>\n",
       "      <td>86.9</td>\n",
       "      <td>2.9</td>\n",
       "      <td>0.0</td>\n",
       "      <td>20.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17527</th>\n",
       "      <td>11.4</td>\n",
       "      <td>0.6</td>\n",
       "      <td>17.3</td>\n",
       "      <td>0.18</td>\n",
       "      <td>83.0</td>\n",
       "      <td>14.8</td>\n",
       "      <td>6.2</td>\n",
       "      <td>81.8</td>\n",
       "      <td>113.8</td>\n",
       "      <td>4.77</td>\n",
       "      <td>5.05</td>\n",
       "      <td>101.2</td>\n",
       "      <td>81.7</td>\n",
       "      <td>3.5</td>\n",
       "      <td>0.0</td>\n",
       "      <td>20.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17528</th>\n",
       "      <td>12.3</td>\n",
       "      <td>0.7</td>\n",
       "      <td>18.7</td>\n",
       "      <td>0.19</td>\n",
       "      <td>79.2</td>\n",
       "      <td>13.9</td>\n",
       "      <td>4.7</td>\n",
       "      <td>94.8</td>\n",
       "      <td>182.7</td>\n",
       "      <td>4.77</td>\n",
       "      <td>2.98</td>\n",
       "      <td>101.2</td>\n",
       "      <td>81.7</td>\n",
       "      <td>3.2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>20.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       TEMP_MEAN  SO2    O3    CO  HUMIDITY   NO2   NO  WDIR_SCLR  RAD_TOTAL  \\\n",
       "17524       10.9  0.5  24.0  0.15      80.6   7.2  0.4       83.6        0.0   \n",
       "17525       10.8  0.4  23.8  0.13      82.0   7.3  0.5       90.4       11.6   \n",
       "17526       10.8  0.5  21.6  0.15      83.5   9.7  1.2       87.0       55.3   \n",
       "17527       11.4  0.6  17.3  0.18      83.0  14.8  6.2       81.8      113.8   \n",
       "17528       12.3  0.7  18.7  0.19      79.2  13.9  4.7       94.8      182.7   \n",
       "\n",
       "       WSPD_VECT  WSPD_SCLR  ATM_PRESS_1HR  WDIR_VECT  PM25  PRECIP_TOTAL  \\\n",
       "17524       4.50       4.59          101.1       82.2   3.6           0.0   \n",
       "17525       6.83       7.17          101.1       91.1   3.2           0.0   \n",
       "17526       6.61       6.90          101.1       86.9   2.9           0.0   \n",
       "17527       4.77       5.05          101.2       81.7   3.5           0.0   \n",
       "17528       4.77       2.98          101.2       81.7   3.2           0.0   \n",
       "\n",
       "       PM10  \n",
       "17524  20.5  \n",
       "17525  20.5  \n",
       "17526  20.5  \n",
       "17527  20.5  \n",
       "17528  20.5  "
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.tail()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "dataset=pd.DataFrame(data)\n",
    "# dataset=pd.to_numeric(dataset, errors='coerce')\n",
    "# train_data=dataset.head(14023)\n",
    "# valid_data=dataset.drop(train_data.index)\n",
    "scaler = preprocessing.MinMaxScaler() \n",
    "scaled_values = scaler.fit_transform(dataset) \n",
    "# dataset.loc[:,:] = scaled_values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>TEMP_MEAN</th>\n",
       "      <th>SO2</th>\n",
       "      <th>O3</th>\n",
       "      <th>CO</th>\n",
       "      <th>HUMIDITY</th>\n",
       "      <th>NO2</th>\n",
       "      <th>NO</th>\n",
       "      <th>WDIR_SCLR</th>\n",
       "      <th>RAD_TOTAL</th>\n",
       "      <th>WSPD_VECT</th>\n",
       "      <th>WSPD_SCLR</th>\n",
       "      <th>ATM_PRESS_1HR</th>\n",
       "      <th>WDIR_VECT</th>\n",
       "      <th>PM25</th>\n",
       "      <th>PRECIP_TOTAL</th>\n",
       "      <th>PM10</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>18.1</td>\n",
       "      <td>0.30</td>\n",
       "      <td>20.20</td>\n",
       "      <td>0.210</td>\n",
       "      <td>76.1</td>\n",
       "      <td>15.60</td>\n",
       "      <td>6.00</td>\n",
       "      <td>307.7</td>\n",
       "      <td>0.0</td>\n",
       "      <td>12.59</td>\n",
       "      <td>12.82</td>\n",
       "      <td>101.7</td>\n",
       "      <td>308.1</td>\n",
       "      <td>3.3</td>\n",
       "      <td>0.0</td>\n",
       "      <td>9.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>18.1</td>\n",
       "      <td>0.30</td>\n",
       "      <td>12.20</td>\n",
       "      <td>0.180</td>\n",
       "      <td>73.0</td>\n",
       "      <td>11.20</td>\n",
       "      <td>5.30</td>\n",
       "      <td>308.1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>14.29</td>\n",
       "      <td>14.64</td>\n",
       "      <td>101.7</td>\n",
       "      <td>309.0</td>\n",
       "      <td>2.5</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>17.4</td>\n",
       "      <td>0.40</td>\n",
       "      <td>11.10</td>\n",
       "      <td>0.180</td>\n",
       "      <td>77.5</td>\n",
       "      <td>13.60</td>\n",
       "      <td>9.30</td>\n",
       "      <td>309.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>13.58</td>\n",
       "      <td>13.83</td>\n",
       "      <td>101.7</td>\n",
       "      <td>308.8</td>\n",
       "      <td>2.5</td>\n",
       "      <td>0.0</td>\n",
       "      <td>7.7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>17.0</td>\n",
       "      <td>0.20</td>\n",
       "      <td>25.10</td>\n",
       "      <td>0.140</td>\n",
       "      <td>83.6</td>\n",
       "      <td>7.20</td>\n",
       "      <td>5.20</td>\n",
       "      <td>296.5</td>\n",
       "      <td>0.0</td>\n",
       "      <td>17.47</td>\n",
       "      <td>17.79</td>\n",
       "      <td>101.6</td>\n",
       "      <td>296.6</td>\n",
       "      <td>3.6</td>\n",
       "      <td>0.0</td>\n",
       "      <td>10.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>17.0</td>\n",
       "      <td>0.25</td>\n",
       "      <td>20.25</td>\n",
       "      <td>0.155</td>\n",
       "      <td>80.5</td>\n",
       "      <td>9.65</td>\n",
       "      <td>6.05</td>\n",
       "      <td>301.9</td>\n",
       "      <td>0.0</td>\n",
       "      <td>16.62</td>\n",
       "      <td>17.04</td>\n",
       "      <td>101.6</td>\n",
       "      <td>301.8</td>\n",
       "      <td>3.2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6.9</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   TEMP_MEAN   SO2     O3     CO  HUMIDITY    NO2    NO  WDIR_SCLR  RAD_TOTAL  \\\n",
       "0       18.1  0.30  20.20  0.210      76.1  15.60  6.00      307.7        0.0   \n",
       "1       18.1  0.30  12.20  0.180      73.0  11.20  5.30      308.1        0.0   \n",
       "2       17.4  0.40  11.10  0.180      77.5  13.60  9.30      309.0        0.0   \n",
       "3       17.0  0.20  25.10  0.140      83.6   7.20  5.20      296.5        0.0   \n",
       "4       17.0  0.25  20.25  0.155      80.5   9.65  6.05      301.9        0.0   \n",
       "\n",
       "   WSPD_VECT  WSPD_SCLR  ATM_PRESS_1HR  WDIR_VECT  PM25  PRECIP_TOTAL  PM10  \n",
       "0      12.59      12.82          101.7      308.1   3.3           0.0   9.2  \n",
       "1      14.29      14.64          101.7      309.0   2.5           0.0   6.5  \n",
       "2      13.58      13.83          101.7      308.8   2.5           0.0   7.7  \n",
       "3      17.47      17.79          101.6      296.6   3.6           0.0  10.5  \n",
       "4      16.62      17.04          101.6      301.8   3.2           0.0   6.9  "
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataset.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>TEMP_MEAN</th>\n",
       "      <th>SO2</th>\n",
       "      <th>O3</th>\n",
       "      <th>CO</th>\n",
       "      <th>HUMIDITY</th>\n",
       "      <th>NO2</th>\n",
       "      <th>NO</th>\n",
       "      <th>WDIR_SCLR</th>\n",
       "      <th>RAD_TOTAL</th>\n",
       "      <th>WSPD_VECT</th>\n",
       "      <th>WSPD_SCLR</th>\n",
       "      <th>ATM_PRESS_1HR</th>\n",
       "      <th>WDIR_VECT</th>\n",
       "      <th>PM25</th>\n",
       "      <th>PRECIP_TOTAL</th>\n",
       "      <th>PM10</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>17529.000000</td>\n",
       "      <td>17529.000000</td>\n",
       "      <td>17529.000000</td>\n",
       "      <td>17529.000000</td>\n",
       "      <td>17529.000000</td>\n",
       "      <td>17529.000000</td>\n",
       "      <td>17529.000000</td>\n",
       "      <td>17529.000000</td>\n",
       "      <td>17529.000000</td>\n",
       "      <td>17529.000000</td>\n",
       "      <td>17529.000000</td>\n",
       "      <td>17529.000000</td>\n",
       "      <td>17529.000000</td>\n",
       "      <td>17529.000000</td>\n",
       "      <td>17529.000000</td>\n",
       "      <td>17529.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>10.877917</td>\n",
       "      <td>0.348773</td>\n",
       "      <td>16.930621</td>\n",
       "      <td>0.238480</td>\n",
       "      <td>78.101597</td>\n",
       "      <td>15.151455</td>\n",
       "      <td>9.903018</td>\n",
       "      <td>159.489674</td>\n",
       "      <td>131.440570</td>\n",
       "      <td>9.555761</td>\n",
       "      <td>10.140468</td>\n",
       "      <td>101.083490</td>\n",
       "      <td>160.406241</td>\n",
       "      <td>5.577751</td>\n",
       "      <td>0.138593</td>\n",
       "      <td>10.370312</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>6.394508</td>\n",
       "      <td>0.429893</td>\n",
       "      <td>11.643593</td>\n",
       "      <td>0.140216</td>\n",
       "      <td>14.132836</td>\n",
       "      <td>10.124329</td>\n",
       "      <td>21.005118</td>\n",
       "      <td>90.570842</td>\n",
       "      <td>214.942927</td>\n",
       "      <td>5.603915</td>\n",
       "      <td>5.533016</td>\n",
       "      <td>0.785188</td>\n",
       "      <td>89.956617</td>\n",
       "      <td>5.462459</td>\n",
       "      <td>0.534607</td>\n",
       "      <td>7.300602</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>-6.800000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>-0.700000</td>\n",
       "      <td>0.010000</td>\n",
       "      <td>17.500000</td>\n",
       "      <td>0.300000</td>\n",
       "      <td>-1.200000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.980000</td>\n",
       "      <td>97.600000</td>\n",
       "      <td>0.200000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>6.300000</td>\n",
       "      <td>0.100000</td>\n",
       "      <td>6.600000</td>\n",
       "      <td>0.150000</td>\n",
       "      <td>68.700000</td>\n",
       "      <td>7.000000</td>\n",
       "      <td>0.500000</td>\n",
       "      <td>90.600000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>5.570000</td>\n",
       "      <td>6.090000</td>\n",
       "      <td>100.700000</td>\n",
       "      <td>91.300000</td>\n",
       "      <td>2.500000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>6.100000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>10.700000</td>\n",
       "      <td>0.200000</td>\n",
       "      <td>16.800000</td>\n",
       "      <td>0.200000</td>\n",
       "      <td>79.900000</td>\n",
       "      <td>12.700000</td>\n",
       "      <td>2.500000</td>\n",
       "      <td>121.800000</td>\n",
       "      <td>5.300000</td>\n",
       "      <td>8.640000</td>\n",
       "      <td>9.160000</td>\n",
       "      <td>101.100000</td>\n",
       "      <td>123.400000</td>\n",
       "      <td>4.200000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>8.700000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>15.800000</td>\n",
       "      <td>0.500000</td>\n",
       "      <td>25.800000</td>\n",
       "      <td>0.270000</td>\n",
       "      <td>89.500000</td>\n",
       "      <td>21.600000</td>\n",
       "      <td>8.800000</td>\n",
       "      <td>257.800000</td>\n",
       "      <td>179.100000</td>\n",
       "      <td>12.560000</td>\n",
       "      <td>13.090000</td>\n",
       "      <td>101.600000</td>\n",
       "      <td>258.600000</td>\n",
       "      <td>6.800000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>12.400000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>28.600000</td>\n",
       "      <td>7.500000</td>\n",
       "      <td>75.000000</td>\n",
       "      <td>1.690000</td>\n",
       "      <td>99.900000</td>\n",
       "      <td>70.800000</td>\n",
       "      <td>291.400000</td>\n",
       "      <td>359.900000</td>\n",
       "      <td>908.200000</td>\n",
       "      <td>48.240000</td>\n",
       "      <td>49.020000</td>\n",
       "      <td>103.500000</td>\n",
       "      <td>359.900000</td>\n",
       "      <td>209.600000</td>\n",
       "      <td>16.000000</td>\n",
       "      <td>119.400000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          TEMP_MEAN           SO2            O3            CO      HUMIDITY  \\\n",
       "count  17529.000000  17529.000000  17529.000000  17529.000000  17529.000000   \n",
       "mean      10.877917      0.348773     16.930621      0.238480     78.101597   \n",
       "std        6.394508      0.429893     11.643593      0.140216     14.132836   \n",
       "min       -6.800000      0.000000     -0.700000      0.010000     17.500000   \n",
       "25%        6.300000      0.100000      6.600000      0.150000     68.700000   \n",
       "50%       10.700000      0.200000     16.800000      0.200000     79.900000   \n",
       "75%       15.800000      0.500000     25.800000      0.270000     89.500000   \n",
       "max       28.600000      7.500000     75.000000      1.690000     99.900000   \n",
       "\n",
       "                NO2            NO     WDIR_SCLR     RAD_TOTAL     WSPD_VECT  \\\n",
       "count  17529.000000  17529.000000  17529.000000  17529.000000  17529.000000   \n",
       "mean      15.151455      9.903018    159.489674    131.440570      9.555761   \n",
       "std       10.124329     21.005118     90.570842    214.942927      5.603915   \n",
       "min        0.300000     -1.200000      0.000000      0.000000      0.050000   \n",
       "25%        7.000000      0.500000     90.600000      0.000000      5.570000   \n",
       "50%       12.700000      2.500000    121.800000      5.300000      8.640000   \n",
       "75%       21.600000      8.800000    257.800000    179.100000     12.560000   \n",
       "max       70.800000    291.400000    359.900000    908.200000     48.240000   \n",
       "\n",
       "          WSPD_SCLR  ATM_PRESS_1HR     WDIR_VECT          PM25  PRECIP_TOTAL  \\\n",
       "count  17529.000000   17529.000000  17529.000000  17529.000000  17529.000000   \n",
       "mean      10.140468     101.083490    160.406241      5.577751      0.138593   \n",
       "std        5.533016       0.785188     89.956617      5.462459      0.534607   \n",
       "min        0.980000      97.600000      0.200000      0.000000      0.000000   \n",
       "25%        6.090000     100.700000     91.300000      2.500000      0.000000   \n",
       "50%        9.160000     101.100000    123.400000      4.200000      0.000000   \n",
       "75%       13.090000     101.600000    258.600000      6.800000      0.000000   \n",
       "max       49.020000     103.500000    359.900000    209.600000     16.000000   \n",
       "\n",
       "               PM10  \n",
       "count  17529.000000  \n",
       "mean      10.370312  \n",
       "std        7.300602  \n",
       "min        0.000000  \n",
       "25%        6.100000  \n",
       "50%        8.700000  \n",
       "75%       12.400000  \n",
       "max      119.400000  "
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataset.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "data_set=np.asarray(dataset,dtype=np.float32)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "seq_len = 30 + 1\n",
    "x=len(data_set)-seq_len\n",
    "sequences = [data_set[t:t+seq_len] for t in range(x)]\n",
    "for i in range(len(sequences)):\n",
    "    sequences[i]=scaler.fit_transform(sequences[i])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "17498"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(sequences)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "seq=torch.FloatTensor(sequences)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([17498, 31, 16])"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "seq.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "split_row=round(0.90*seq.size(0))\n",
    "x_train_set=seq[:split_row, :-1]\n",
    "y_train_set=seq[:split_row, -1]\n",
    "x_valid_set=seq[split_row:, :-1]\n",
    "y_valid_set=seq[split_row:, -1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([15748, 30, 16])\n",
      "torch.Size([15748, 16])\n",
      "torch.Size([1750, 30, 16])\n",
      "torch.Size([1750, 16])\n"
     ]
    }
   ],
   "source": [
    "print(x_train_set.shape)\n",
    "print(y_train_set.shape)\n",
    "print(x_valid_set.shape)\n",
    "print(y_valid_set.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "class LSTM(nn.Module):\n",
    "    def __init__(self,input_size,hidden_size,num_layers=2,dropout=0,bidirectional=False):\n",
    "        super(LSTM,self).__init__()\n",
    "        self.input_size=input_size\n",
    "        self.hidden_size=hidden_size\n",
    "        self.num_layers=num_layers\n",
    "        self.dropout=dropout\n",
    "        self.bidirectional=bidirectional\n",
    "        self.lstm = nn.LSTM(input_size,\n",
    "                            hidden_size,\n",
    "                            num_layers,\n",
    "                            dropout=dropout,\n",
    "                            bidirectional=bidirectional)\n",
    "        self.linear = nn.Linear(hidden_size, input_size)\n",
    "        \n",
    "    def forward(self,inputs,hidden):\n",
    "        outputs,hidden=self.lstm(inputs,hidden)\n",
    "        predictions=self.linear(outputs[-1])\n",
    "        return predictions,outputs,hidden\n",
    "    \n",
    "    def init_hidden(self,batch_size):\n",
    "        num_directions=2 if self.bidirectional else 1\n",
    "        hidden = (torch.zeros(self.num_layers*num_directions, batch_size, self.hidden_size),\n",
    "                  torch.zeros(self.num_layers*num_directions, batch_size, self.hidden_size))\n",
    "        return hidden"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_batch(x,y,i,batch_size):\n",
    "    if x.dim() == 2:\n",
    "        x = x.unsqueeze(2)\n",
    "    batch_x = x[(i*batch_size):(i*batch_size)+batch_size, :, :]\n",
    "    batch_y = y[(i*batch_size):(i*batch_size)+batch_size]\n",
    "\n",
    "    # Reshape Tensors into (seq_len, batch_size, input_size) format for the LSTM.\n",
    "    batch_x = batch_x.transpose(0, 1)\n",
    "    \n",
    "    return batch_x, batch_y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "def train(model,x_train_set,y_train_set,optimizer,batch_size,epoch):\n",
    "    num_sequences=x_train_set.size(0)\n",
    "    num_batches=num_sequences//batch_size\n",
    "    \n",
    "    total_loss=0\n",
    "    \n",
    "    model.train()\n",
    "    for i in range(num_batches):\n",
    "        # Get input and target batches and reshape for LSTM.\n",
    "        batch_x, batch_y = get_batch(x_train_set, y_train_set, i, batch_size)\n",
    "\n",
    "        # Reset the gradient.\n",
    "        lstm.zero_grad()\n",
    "        \n",
    "        # Initialize the hidden states (see the function lstm.init_hidden(batch_size)).\n",
    "        hidden = lstm.init_hidden(batch_size)\n",
    "        \n",
    "        # Complete a forward pass.\n",
    "        y_pred, outputs, hidden = lstm(batch_x,hidden)\n",
    "        \n",
    "        # Calculate the loss with the 'loss_fn'.\n",
    "        loss = loss_fn(y_pred,batch_y)\n",
    "        \n",
    "        # Compute the gradient.\n",
    "        loss.backward()\n",
    "        \n",
    "        # Clip to the gradient to avoid exploding gradient.\n",
    "        nn.utils.clip_grad_norm_(lstm.parameters(), max_grad_norm)\n",
    "\n",
    "        # Make one step with optimizer.\n",
    "        optimizer.step()\n",
    "        \n",
    "        # Accumulate the total loss.\n",
    "        total_loss += loss.data\n",
    "        \n",
    "    print(\"Epoch {}: Loss = {:.8f}\".format(epoch+1, total_loss/num_batches))\n",
    "    return total_loss/num_batches"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [],
   "source": [
    "def eval(model,x_valid_set,y_valid_set,optimizer,batch_size):\n",
    "    num_sequences=x_valid_set.size(0)\n",
    "    num_batches=num_sequences//batch_size\n",
    "    \n",
    "    total_loss=0\n",
    "    \n",
    "    model.eval()\n",
    "    for i in range(num_batches):\n",
    "        # Get input and target batches and reshape for LSTM.\n",
    "        batch_x, batch_y = get_batch(x_valid_set, y_valid_set, i, batch_size)\n",
    "\n",
    "        # Reset the gradient.\n",
    "        lstm.zero_grad()\n",
    "        \n",
    "        # Initialize the hidden states (see the function lstm.init_hidden(batch_size)).\n",
    "        hidden = lstm.init_hidden(batch_size)\n",
    "        \n",
    "        # Complete a forward pass.\n",
    "        y_pred, outputs, hidden = lstm(batch_x,hidden)\n",
    "        \n",
    "        # Calculate the loss with the 'loss_fn'.\n",
    "        loss = loss_fn(y_pred,batch_y)\n",
    "        \n",
    "        # Compute the gradient.\n",
    "        loss.backward()\n",
    "        \n",
    "        # Clip to the gradient to avoid exploding gradient.\n",
    "        nn.utils.clip_grad_norm_(lstm.parameters(), max_grad_norm)\n",
    "\n",
    "        # Make one step with optimizer.\n",
    "        optimizer.step()\n",
    "        \n",
    "        # Accumulate the total loss.\n",
    "        total_loss += loss.data\n",
    "\n",
    "    print(\"Validation: Loss = {:.8f}\".format(total_loss/num_batches))\n",
    "    return total_loss/num_batches"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "def save_model(epoch, model, path='./'):\n",
    "    \n",
    "    # file name and path \n",
    "    filename = path + 'vancouver.pt'\n",
    "    \n",
    "    # load the model parameters \n",
    "    torch.save(model.state_dict(), filename)\n",
    "    \n",
    "    \n",
    "    return model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "def load_model(epoch, model, path='./'):\n",
    "    \n",
    "    # file name and path \n",
    "    filename = path + 'neural_network_{}.pt'.format(epoch)\n",
    "    \n",
    "    # load the model parameters \n",
    "    model.load_state_dict(torch.load(filename))\n",
    "    \n",
    "    \n",
    "    return model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training model for 30 epoch\n",
      "Epoch 1: Loss = 0.06152879\n",
      "Validation: Loss = 0.03949843\n",
      "Epoch 2: Loss = 0.03668826\n",
      "Validation: Loss = 0.03217665\n",
      "Epoch 3: Loss = 0.03224830\n",
      "Validation: Loss = 0.02941380\n",
      "Epoch 4: Loss = 0.03048507\n",
      "Validation: Loss = 0.02826443\n",
      "Epoch 5: Loss = 0.02950189\n",
      "Validation: Loss = 0.02747993\n",
      "Epoch 6: Loss = 0.02875098\n",
      "Validation: Loss = 0.02692362\n",
      "Epoch 7: Loss = 0.02825264\n",
      "Validation: Loss = 0.02659697\n",
      "Epoch 8: Loss = 0.02793995\n",
      "Validation: Loss = 0.02636658\n",
      "Epoch 9: Loss = 0.02770331\n",
      "Validation: Loss = 0.02617960\n",
      "Epoch 10: Loss = 0.02750557\n",
      "Validation: Loss = 0.02601817\n",
      "Epoch 11: Loss = 0.02733195\n",
      "Validation: Loss = 0.02587440\n",
      "Epoch 12: Loss = 0.02717480\n",
      "Validation: Loss = 0.02574445\n",
      "Epoch 13: Loss = 0.02702963\n",
      "Validation: Loss = 0.02562607\n",
      "Epoch 14: Loss = 0.02689403\n",
      "Validation: Loss = 0.02551761\n",
      "Epoch 15: Loss = 0.02676650\n",
      "Validation: Loss = 0.02541774\n",
      "Epoch 16: Loss = 0.02664623\n",
      "Validation: Loss = 0.02532529\n",
      "Epoch 17: Loss = 0.02653285\n",
      "Validation: Loss = 0.02523909\n",
      "Epoch 18: Loss = 0.02642611\n",
      "Validation: Loss = 0.02515809\n",
      "Epoch 19: Loss = 0.02632583\n",
      "Validation: Loss = 0.02508137\n",
      "Epoch 20: Loss = 0.02623157\n",
      "Validation: Loss = 0.02500809\n",
      "Epoch 21: Loss = 0.02614251\n",
      "Validation: Loss = 0.02493771\n",
      "Epoch 22: Loss = 0.02605802\n",
      "Validation: Loss = 0.02486984\n",
      "Epoch 23: Loss = 0.02597742\n",
      "Validation: Loss = 0.02480425\n",
      "Epoch 24: Loss = 0.02590017\n",
      "Validation: Loss = 0.02474078\n",
      "Epoch 25: Loss = 0.02582584\n",
      "Validation: Loss = 0.02467941\n",
      "Epoch 26: Loss = 0.02575406\n",
      "Validation: Loss = 0.02462011\n",
      "Epoch 27: Loss = 0.02568464\n",
      "Validation: Loss = 0.02456284\n",
      "Epoch 28: Loss = 0.02561730\n",
      "Validation: Loss = 0.02450754\n",
      "Epoch 29: Loss = 0.02555200\n",
      "Validation: Loss = 0.02445418\n",
      "Epoch 30: Loss = 0.02548844\n",
      "Validation: Loss = 0.02440265\n",
      "\n",
      "\n",
      "\n",
      "Optimization ended.\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "input_size=16\n",
    "hidden_size=24\n",
    "num_layers=2\n",
    "lstm=LSTM(input_size,hidden_size)\n",
    "\n",
    "learning_rate=0.001\n",
    "max_grad_norm=5\n",
    "loss_fn = nn.MSELoss()\n",
    "optimizer = optim.Adam(lstm.parameters(), lr=learning_rate)\n",
    "\n",
    "batch_size = 8\n",
    "num_epochs = 30 #3\n",
    "# num_sequences = x_train_set.size(0)\n",
    "# num_batches = num_sequences //batch_size\n",
    "\n",
    "checkpoint_freq = 10\n",
    "path = './'\n",
    "\n",
    "train_losses=[]\n",
    "valid_losses=[]\n",
    "\n",
    "print(\"Training model for {} epoch\".format(num_epochs))\n",
    "for epoch in range(num_epochs):\n",
    "    total_loss = 0\n",
    "\n",
    "    # Shuffle input and target sequences.\n",
    "    idx = torch.randperm(x_train_set.size(0))\n",
    "    x = x_train_set[idx]\n",
    "    y = y_train_set[idx]\n",
    "\n",
    "    train_loss=train(lstm,x_train_set,y_train_set,optimizer,batch_size,epoch)\n",
    "    valid_loss=eval(lstm,x_valid_set,y_valid_set,optimizer,batch_size)\n",
    "    \n",
    "    train_losses.append(train_loss)\n",
    "    valid_losses.append(valid_loss)\n",
    "    \n",
    "    # Checkpoint\n",
    "    if epoch % checkpoint_freq ==0:\n",
    "        save_model(epoch, lstm, path)\n",
    "        \n",
    "# Last checkpoint\n",
    "save_model(num_epochs, lstm, path)\n",
    "    \n",
    "print(\"\\n\\n\\nOptimization ended.\\n\")\n",
    "\n",
    "plt.plot(train_losses, color=\"darkcyan\", label=\"train\")\n",
    "plt.plot(valid_losses, color=\"tomato\",label=\"validation\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "def predict_one_hour(model,x_valid_set,input_size,num_steps):\n",
    "    predictions=torch.zeros(num_steps)\n",
    "    for i, x in enumerate(x_valid_set):\n",
    "        hidden=model.init_hidden(1)\n",
    "        y_pred,_,_=model(x.contiguous().view(-1, 1, input_size),hidden)\n",
    "        predictions[i]=y_pred[:,-3]\n",
    "    return predictions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "one_step_predictions = predict_one_hour(lstm, x_valid_set, input_size, y_valid_set.size(0))\n",
    "plt.plot(y_valid_set[:,-3].data.numpy(),color='darkcyan')\n",
    "plt.plot(one_step_predictions.data.numpy(),color='tomato')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
